package com.fxd.proxy;


import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @auther fuxudong
 * @date 2021/1/20 - 11:38
 */
public class proxyTest {

    @Test
    public void proxy() {
        //1,创建真实对象
        final lenovo len = new lenovo();
        //2,动态代理增强len对象
        /**
         * 三个参数
         * 1，类加载器
         * 2，接口数组
         * 3，处理器
         */
        saleComputer proxy_len = (saleComputer) Proxy.newProxyInstance(len.getClass().getClassLoader(), len.getClass().getInterfaces(), new InvocationHandler() {
            /**
             *代理逻辑编写的方法，代理对象调用的所有方法都会触发该方法执行
             * 参数：
             * 1，proxy:代理对象
             * 2,method:代理对象调用的方法，被封装为的对象
             * 3,args:代理对象调用的方法，传递的实际参数
             */
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //System.out.println("proxy执行");
                //System.out.println(method.getName());
                // System.out.println(Arrays.toString(args));
                //1,增强参数
                //判断是否是sale方法
                if (method.getName().equals("sale")) {
                    //1,增强参数
                    double money = Double.parseDouble(args[0].toString());
                    money= money = money * 0.85;
                    //3,增强方法体
                    System.out.println("专车接你...");
                    String obj=(String)method.invoke(len,money);
                    System.out.println("免费送货...");
                    //2,增强返回值
                    return obj+"和鼠标垫";
                }else {
                    //使用真实对象调用该方法
                    Object obj = method.invoke(len, args);
                    return obj;
                }
            }
        });


        //2,调用方法
        String computer = proxy_len.sale(8000);
        System.out.println(computer);
    }

}
